Skip to content

Instantly share code, notes, and snippets.

@curtmack
Last active March 13, 2019 18:21
Show Gist options
  • Save curtmack/336a10a3d0ce0efb4f1840bf3dd4e220 to your computer and use it in GitHub Desktop.
Save curtmack/336a10a3d0ce0efb4f1840bf3dd4e220 to your computer and use it in GitHub Desktop.
FizzBuzz in MIXAL
* FIZZBUZZ IN MIX
SENTINEL EQU 715 * SENTINEL VALUE FOR TERMINATING THE OUTPUT BUFFERS
FIRST EQU 1 * NUMBER TO START AT
LAST EQU 100 * NUMBER TO END AT
PUNCH EQU 17 * UNIT NUMBER FOR THE CARD PUNCH
BUFSIZE EQU 16 * BLOCK SIZE OF THE CARD PUNCH
* THE SENTINEL VALUE 715 CORRESPONDS TO TWO DELTA CHARACTERS
* WHICH THIS PROGRAM WILL NEVER PUT INTO THE BUFFER
* START OF VARIABLES AND CONSTANTS
ORIG 1000
SPACES ALF " " * TEN SPACES FOR FILLING
ALF " " * THE LAST CARD
FIZZA ALF "FIZZ " * FIZZ PADDED TO TEN BYTES
ALF " "
BUZZA ALF "BUZZ " * BUZZ PADDED TO TEN BYTES
ALF " "
FIZZBUZZA ALF "FIZZB" * FIZZBUZZ PADDED TO TEN BYTES
ALF "UZZ "
* DIVISIBILITY TABLE FOR 0-14 MOD 15
* 0 MEANS NOT DIVISIBLE, OTHERWISE POINTS TO OUTPUT STRING
DIVTABLE CON FIZZBUZZA * 0
CON 0 * 1
CON 0 * 2
CON FIZZA * 3
CON 0 * 4
CON BUZZA * 5
CON FIZZA * 6
CON 0 * 7
CON 0 * 8
CON FIZZA * 9
CON BUZZA * 10
CON 0 * 11
CON FIZZA * 12
CON 0 * 13
DIVTABEND CON 0 * 14
* OUTPUT BUFFERS
* EACH ENDS WITH A SENTINEL AND A POINTER TO THE OTHER BUFFER
BUF1 ORIG *+BUFSIZE
CON SENTINEL
CON *+1
BUF2 ORIG *+BUFSIZE
CON SENTINEL
CON BUF1
* START OF PROGRAM
ORIG 2000
START ENT1 BUF1 * INITIALIZE BUFFER POINTER
ENT3 FIRST * INITIALIZE COUNTER
ENT4 DIVTABLE+FIRST * INITIALIZE DIV COUNTER
LOOP CMP3 =LAST= * FINALIZE IF WE'RE PAST THE END
JG FINALIZE
JMP OUTPUT * WRITE THE CURRENT VALUE
INC3 1 * INCREMENT COUNTER
INC4 1 * INCREMENT DIV COUNTER
CMP4 =DIVTABEND= * RESTART LOOP IF WE'RE STILL IN THE DIV TABLE
JLE LOOP
ENT4 DIVTABLE * OTHERWISE MOVE BACK TO START OF TABLE
JMP LOOP
* SUBROUTINE OUTPUT
* WRITES THE APPROPRIATE OUTPUT FOR THE CURRENT COUNTER TO THE BUFFER
* AUTOMATICALLY FLUSHES THE BUFFER IF NECESSARY
* CALL WITH I1 = CURRENT BUFFER ADDRESS,
* I3 = COUNTER,
* I4 = DIV COUNTER
* CLOBBERS A, X, I2
OUTPUT STJ 9F
LD2 0,4 * LOAD FROM DIV TABLE
J2Z 2F * IF ZERO, SKIP TO NUMBER PRINT
MOVE 0,2(2) * COPY TEXT POINTER TO OUTPUT
JMP 3F * SKIP TO BUFFER CHECK
2H ENTA 0,3 * CONVERT THE COUNTER
CHAR * TO TEXTUAL REPRESENTATION
SLAX 5 * "0000000XXX" TO "00XXX "
STA 0,1 * WRITE 00XXX TO BUFFER
STX 1,1 * WRITE SPACES AFTER IT
INC1 2 * INCREMENT BUFFER POINTER
3H LD2 0,1 * CHECK IF WE REACHED THE SENTINEL
CMP2 =SENTINEL=
JNE 9F * IF NOT, SKIP TO END
OUT -16,1(PUNCH) * FLUSH CURRENT BUFFER
LD1 1,1 * USE NEXT POINTER TO SWITCH BUFFERS
9H JMP * * RETURN FROM SUBROUTINE
* SUBROUTINE FINALIZE
* FINISHES OUT THE LAST PUNCH CARD WITH SPACES AND WRITES IT
* DOES NOT RETURN
* CALL WITH I1 = CURRENT BUFFER ADDRESS
FINALIZE CMP1 =BUF1= * DID WE JUST SWITCH TO BUF1
JE 8F * IF SO, SKIP LAST CARD
CMP1 =BUF2= * SAME CHECK FOR BUF2
JE 8F
2H LD2 0,1 * CHECK IF WE REACHED THE SENTINEL
CMP2 =SENTINEL=
JE 7F * IF WE DID, SKIP TO END
MOVE SPACES(2) * OTHERWISE MOVE TEN SPACES INTO BUFFER
JMP 2B * AND REPEAT
7H OUT -16,1(PUNCH) * OUTPUT LAST CARD
8H JBUS *(PUNCH) * WAIT UNTIL LAST CARD PRINTS
HLT * HALT THE MACHINE
END START * END OF PROGRAM
00001 00002 FIZZ 00004 BUZZ FIZZ 00007 00008
FIZZ BUZZ 00011 FIZZ 00013 00014 FIZZBUZZ 00016
00017 FIZZ 00019 BUZZ FIZZ 00022 00023 FIZZ
BUZZ 00026 FIZZ 00028 00029 FIZZBUZZ 00031 00032
FIZZ 00034 BUZZ FIZZ 00037 00038 FIZZ BUZZ
00041 FIZZ 00043 00044 FIZZBUZZ 00046 00047 FIZZ
00049 BUZZ FIZZ 00052 00053 FIZZ BUZZ 00056
FIZZ 00058 00059 FIZZBUZZ 00061 00062 FIZZ 00064
BUZZ FIZZ 00067 00068 FIZZ BUZZ 00071 FIZZ
00073 00074 FIZZBUZZ 00076 00077 FIZZ 00079 BUZZ
FIZZ 00082 00083 FIZZ BUZZ 00086 FIZZ 00088
00089 FIZZBUZZ 00091 00092 FIZZ 00094 BUZZ FIZZ
00097 00098 FIZZ BUZZ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment