trog/TROGPRNT.ASM

1547 lines
31 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.MLIB "TROGMACS.LIB"
.FILE 'TROGPRNT.ASM'
.TITLE "TROG PRINTING ROUTINES"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "STRING.H"
.INCLUDE "TROGSEQU.ASM"
.INCLUDE "TROGMEQU.ASM"
.INCLUDE "TROGAUDN.ASM"
.INCLUDE "TROGDIP.ASM"
.IF PRINTER
.REF GET_ADJ, DEC_HSR
.REF DEF_PAGE, AUD, AUD1, SET_PAGE
.REF RC_BYTE, RC_BYTEI, RC_WORD, RC_WORDI
.REF WC_BYTE, WC_BYTEI, WC_WORD, WC_WORDI
.REF WIPEOUT, COLOR_START
.REF P_FORK, ADJ_PAGE
.REF CHECKDIPFREE, READ_DIP, FORCEDIP
.REF G_CRED
.REF GET_CSPT
.REF AUD1, STORE_AUDIT, GET_AUD
.REF ROM_NAME
.REF PRINTAUDTABLE
.REF PRINTCOINTABLE
.REF CAT_A0, STRCAT
.REF GET_PLAYS
.REF CRED_P
.REF GPLAYNUM
.REF TUNNEL
.REF GAMEUNITS
.DEF PRINTP, TROGALIVE, RAWPRINT, DOGGYPRINT
.DEF PBUFCK
.DEF PRINTAUDS
.DEF PRINTERIN,PRINTEROUT,PRINTDEAD
.DEF PGAMESTART, PGAMEEND, PGAMEBUYIN, PGAMECONT, PIDIED
.DEF PGAMEWAVE, PGAMEWARP
.DEF OFFTIME, LASTSTACK,LASTA0
.DEF PLCOIN,PRCOIN,PSCOIN, PBADGUY
.DEF PGAMELEVEL
.DEF PRINT_DUMP
PBUFSIZE EQU 2048 ; BUFFER SIZE -- MUST BE POWER OF 2
.BSS OFFTIME,32
.BSS LASTSTACK,32 ; LAST STACK POINTER
.BSS LASTA0,32 ; LAST VALUE OF A0
.BSS PRINTERIN,16 ; INPUT POINTER
.BSS PRINTEROUT,16 ; OUTPUT POINTER
.BSS PRINTERBUF,8*PBUFSIZE ; PRINTER BUFFER
.BSS PRINTDEAD,16 ; PRINTER STATUS FLAG
.BSS WORKNUM,16
.BSS WORKSTR,32
.BSS AREGFILE,16*32
.BSS STACKFILE,10*32
.BSS MYSTRING,128*8
.BSS STRINGERFLAG,16
**************************************************************************
* *
* PRINTER EQUATES *
* *
**************************************************************************
PRINTSTROBE EQU 0EFFFH ; STROBE LINE LOW
PRINTUNSTROBE EQU 0FF00H ; UNSTROBE THE LINE
PRINTRESET EQU 0DF00H ; PRINTER RESET
**************************************************************************
* *
* GLOBAL VARIABLES *
* *
**************************************************************************
.TEXT
.EVEN
**************************************************************************
* *
* DUMPPRINT *
* *
* PRINT OUT A LOT OF USEFUL INFORMATION TO THE PRINTER *
* *
* ENTRY *
* ALL THE REGISTERS/TOP 10 STACK WORDS *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PRINT_DUMP
.IF DEBUG
DINT
JRUC $
.ENDIF
MMTM SP,A0,A1,A2,A8
MOVE A0,@AREGFILE,L ; A0
MOVI AREGFILE+20H,A0
MOVE A1,*A0+,L
MOVE A2,*A0+,L
MOVE A3,*A0+,L
MOVE A4,*A0+,L
MOVE A5,*A0+,L
MOVE A6,*A0+,L
MOVE A7,*A0+,L
MOVE A8,*A0+,L
MOVE A9,*A0+,L
MOVE A10,*A0+,L
MOVE A11,*A0+,L
MOVE A12,*A0+,L
MOVE A13,*A0+,L
MOVE A14,*A0+,L
MOVI DUMPMESS,A8
JSRP PRINTP
MOVI DMTIME,A8
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
MOVI AREGPRINT,A8
JSRP PRINTP
CALLR NEWLINE
MOVE B0,@AREGFILE,L ; B0
MOVI AREGFILE+20H,B0
MOVE B1,*B0+,L
MOVE B2,*B0+,L
MOVE B3,*B0+,L
MOVE B4,*B0+,L
MOVE B5,*B0+,L
MOVE B6,*B0+,L
MOVE B7,*B0+,L
MOVE B8,*B0+,L
MOVE B9,*B0+,L
MOVE B10,*B0+,L
MOVE B11,*B0+,L
MOVE B12,*B0+,L
MOVE B13,*B0+,L
MOVE B14,*B0+,L
MOVE @AREGFILE,B0,L ; RESTORE B0
MOVI BREGPRINT,A8
JSRP PRINTP
CALLR NEWLINE
MOVI 11,A2
MOVE SP,A1 ; GRAB THE STACK
ADDI 0A0H,A1
MOVI AREGFILE,A0
DSLOOP
MOVE *A1+,*A0+,L
DSJS A2,DSLOOP
MOVI STACKPRINT,A8
JSRP PRINTP
CALLR NEWLINE
MMFM SP,A0,A1,A2,A8
RETS
DUMPMESS
.STRING "\b****************************************\b",0AH,00
.WORD 1
.WORD 0
.EVEN
DMTIME .STRING "DUMP TIME ",0
.EVEN
AREGPRINT
.STRING " - A0 - - A1 - - A2 - - A3 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - A4 - - A5 - - A6 - - A7 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - A8 - - A9 - - A10 - - A11 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - A12 - - A13 - - A14 - ",0AH
.STRING " %08lX %08lX %08lX ",0Ah,0
.LONG AREGFILE+00H, AREGFILE+20H, AREGFILE+40H, AREGFILE+60H
.LONG AREGFILE+80H, AREGFILE+0A0H, AREGFILE+0C0H, AREGFILE+0E0H
.LONG AREGFILE+100H, AREGFILE+120H, AREGFILE+140H, AREGFILE+160H
.LONG AREGFILE+180H, AREGFILE+1A0H, AREGFILE+1C0H
.BYTE 0
.EVEN
BREGPRINT
.STRING " - B0 - - B1 - - B2 - - B3 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - B4 - - B5 - - B6 - - B7 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - B8 - - B9 - - B10 - - B11 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - B12 - - B13 - - B14 - ",0AH
.STRING " %08lX %08lX %08lX ",0Ah,0
.LONG AREGFILE+00H, AREGFILE+20H, AREGFILE+40H, AREGFILE+60H
.LONG AREGFILE+80H, AREGFILE+0A0H, AREGFILE+0C0H, AREGFILE+0E0H
.LONG AREGFILE+100H, AREGFILE+120H, AREGFILE+140H, AREGFILE+160H
.LONG AREGFILE+180H, AREGFILE+1A0H, AREGFILE+1C0H
.BYTE 0
.EVEN
STACKPRINT
.STRING " - S0 - - S1 - - S2 - - S3 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - S4 - - S5 - - S6 - - S7 - ",0AH
.STRING " %08lX %08lX %08lX %08lX",0Ah
.STRING " - S8 - - S9 - ",0AH
.STRING " %08lX %08lX ",0Ah,0
.LONG AREGFILE+00H, AREGFILE+20H, AREGFILE+40H, AREGFILE+60H
.LONG AREGFILE+80H, AREGFILE+0A0H, AREGFILE+0C0H, AREGFILE+0E0H
.LONG AREGFILE+100H, AREGFILE+120H
.BYTE 0
.EVEN
**************************************************************************
* *
* PGAMESTART *
* *
* PRINT OUT A GAME START *
* *
**************************************************************************
PGAMESTART
MMTM SP,A0,A1,A2,A3,A4,A8
CALLA GPLAYNUM ; ( OFF OF A2 )
SLL 5,A0
ADDI MGSTARTTAB,A0
MOVE *A0,A8,L
CALLR SETRED
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
CALLR SETBLACK
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGSTARTTAB
.LONG MGSTART1, MGSTART2, MGSTART3, MGSTART4
MGSTART1
.STRING "GAME START BY REX",0
.EVEN
MGSTART2
.STRING "GAME START BY BLOOP",0
.EVEN
MGSTART3
.STRING "GAME START BY SPIKE",0
.EVEN
MGSTART4
.STRING "GAME START BY GWEN",0
.EVEN
;
; A8 IS THE LEVEL ( 0 -> 3 ) TO USE
;
PGAMELEVEL
MMTM SP,A0,A1,A2,A3,A4,A8
SLL 5,A8
ADDI MGLEVELTAB,A8
MOVE *A8,A8,L
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGLEVELTAB
.LONG MGLEVEL2, MGLEVEL3, MGLEVEL4, MGLEVEL1
MGLEVEL1
.STRING "INSTRUCTIONAL LEVEL",0
.EVEN
MGLEVEL2
.STRING "EASY LEVEL",0
.EVEN
MGLEVEL3
.STRING "ADVANCED LEVEL",0
.EVEN
MGLEVEL4
.STRING "EXPERT LEVEL",0
.EVEN
PGAMEEND
MMTM SP,A0,A1,A2,A3,A4,A8
CALLA GPLAYNUM ; ( OFF OF A2 )
SLL 5,A0
ADDI MGENDTAB,A0
MOVE *A0,A8,L
CALLR SETRED
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
CALLR SETBLACK
MOVI MGENDCREDS,A8
MOVE @GAMEUNITS,A1,W ; UNITS USED
CLR A2
CALLA FORMATLINE
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGENDTAB
.LONG MGEND1, MGEND2, MGEND3, MGEND4
MGEND1 .STRING "GAME END BY REX",0
.EVEN
MGEND2 .STRING "GAME END BY BLOOP",0
.EVEN
MGEND3 .STRING "GAME END BY SPIKE",0
.EVEN
MGEND4 .STRING "GAME END BY GWEN",0
.EVEN
MGENDCREDS
.STRING "CREDITS USED",0
.EVEN
PGAMEBUYIN
MMTM SP,A0,A1,A2,A3,A4,A8
CALLA GPLAYNUM ; ( OFF OF A2 )
SLL 5,A0
ADDI MGBUYINTAB,A0
MOVE *A0,A8,L
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGBUYINTAB
.LONG MGBUYIN1, MGBUYIN2, MGBUYIN3, MGBUYIN4
MGBUYIN1
.STRING "GAME BUYIN BY REX",0
.EVEN
MGBUYIN2
.STRING "GAME BUYIN BY BLOOP",0
.EVEN
MGBUYIN3
.STRING "GAME BUYIN BY SPIKE",0
.EVEN
MGBUYIN4
.STRING "GAME BUYIN BY GWEN",0
.EVEN
PIDIED
MMTM SP,A0,A1,A2,A3,A4,A8
CALLA GPLAYNUM ; ( OFF OF A2 )
SLL 5,A0
ADDI MGDEADTAB,A0
MOVE *A0,A8,L
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGDEADTAB
.LONG MGDEAD1, MGDEAD2, MGDEAD3, MGDEAD4
MGDEAD1 .STRING "REX FINAL DEATH",0
.EVEN
MGDEAD2 .STRING "BLOOP FINAL DEATH",0
.EVEN
MGDEAD3 .STRING "SPIKE FINAL DEATH",0
.EVEN
MGDEAD4 .STRING "GWEN FINAL DEATH",0
.EVEN
PGAMEWAVE
MMTM SP,A0,A1,A2,A3,A4,A8
CALLA GPLAYNUM ; ( OFF OF A2 )
SLL 5,A0
ADDI DINO_TAB,A0
MOVE *A0,A0,L
MOVE A0,@WORKSTR,L ; STORE THE NAME
MOVI MGWAVE,A8
CALLA STRINGF
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGWAVE .STRING "WAVE %d WON BY %p",0
.LONG WAVE
.LONG WORKSTR
.EVEN
SETRED
PUSH A0
MOVI 1BH,A0
CALLR PADDCHAR
MOVI 34H,A0
CALLR PADDCHAR
PULL A0
RETS
SETBLACK
PUSH A0
MOVI 1BH,A0
CALLR PADDCHAR
MOVI 35H,A0
CALLR PADDCHAR
PULL A0
RETS
PGAMECONT
MMTM SP,A0,A1,A2,A3,A4,A8
CALLA GPLAYNUM ; ( OFF OF A2 )
SLL 5,A0
ADDI MGCONTTAB,A0
MOVE *A0,A8,L
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGCONTTAB
.LONG MGCONT1, MGCONT2, MGCONT3, MGCONT4
MGCONT1 .STRING "GAME CONTINUE BY REX",0
.EVEN
MGCONT2 .STRING "GAME CONTINUE BY BLOOP",0
.EVEN
MGCONT3 .STRING "GAME CONTINUE BY SPIKE",0
.EVEN
MGCONT4 .STRING "GAME CONTINUE BY GWEN",0
.EVEN
PGAMEWARP
MMTM SP,A0,A1,A2,A3,A4,A8
MOVI MGWARP,A8
CALLA STRINGF
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
MGWARP .STRING "---> Warp to wave %d",0
.LONG TUNNEL
.EVEN
DINO_TAB:
.LONG P1NAME,P2NAME,P3NAME,P4NAME,0
P1NAME:
.STRING "REX",0
.EVEN
P2NAME:
.STRING "BLOOP",0
.EVEN
P3NAME:
.STRING "SPIKE",0
.EVEN
P4NAME:
.STRING "GWEN",0
.EVEN
**************************************************************************
* *
* PBADGUY *
* *
* PLOT THE VARIOUS MESSAGES AS A GUY CLEARS CREDITS AND THINGS *
* *
* ENTRY *
* A0 WHICH MESSAGE TO PUT UP *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALLA *
* *
**************************************************************************
PBADGUY
MMTM SP,A0,A1,A2,A3,A4,A8
SLL 5,A0
ADDI PBCRUNCHER,A0
MOVE *A0,A8,L
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLR SETRED
CALLA FORMATLINE
CALLR SETBLACK
MMFM SP,A0,A1,A2,A3,A4,A8
RETS
PBCRUNCHER:
.LONG PBSTR0,PBSTR1,PBSTR2,PBSTR3,PBSTR4,PBSTR5,PBSTR6,PBSTR7
.LONG PBSTR8,PBSTR9,PBSTR10
PBSTR0 .STRING "CLEAR COIN COUNTS",0
.EVEN
PBSTR1 .STRING "SET OPERATOR MESSAGE",0
.EVEN
PBSTR2 .STRING "CLEAR CREDITS",0
.EVEN
PBSTR3 .STRING "BOGUS MESSAGE",0
.EVEN
PBSTR4 .STRING "CLEAR GAME AUDITS",0
.EVEN
PBSTR5 .STRING "RESET HIGH SCORES",0
.EVEN
PBSTR6 .STRING "DEFAULT ADJUSTMENTS",0
.EVEN
PBSTR7 .STRING "FULL FACTORY RESTORE",0
.EVEN
PBSTR8 .STRING "ENTER TEST MODE",0
.EVEN
PBSTR9 .STRING "CMOS RESET, DUDE!",0
.EVEN
PBSTR10 .STRING "CMOS TOTALLY OUT TO LUNCH",0
.EVEN
**************************************************************************
* *
* DOGGYPRINT *
* *
* SOMETHING HIT THE WATCH DOG -- BARK! *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
DOGGYPRINT:
PUSH A8
MOVI DOGMESS,A8
CALLR RAWPRINT ; AIN'T GOT NOTHING TO DO
PULL A8
CALLA READ_DIP
ANDI 40H,A0
JRNZ DOGGYDONE ; DON'T PRINT IF DS1-7 ON
CALLR DOGGYDUMP
DOGGYDONE
RETS
DOGMESS
.BYTE 0AH
.BYTE 1BH, 34H
.STRING "WATCH DOG RESET DETECTED"
.BYTE 1BH, 35H
.BYTE 0AH,0
.WORD 1
.WORD 0
.EVEN
DOGGYDUMP
.IF DEBUG
RETS ; DON'T LOCKUP ON THIS THING
.ENDIF
.IF YUNIT
.ELSE
RETS ; RETURN ON Z UNITS
.ENDIF
MMTM SP,A0,A1,A2,A8
MOVE @LASTA0,A0,L ; FAKE OUT THE SYSTEM
MOVE A0,@AREGFILE,L ; A0
MOVI AREGFILE+20H,A0
MOVE A1,*A0+,L
MOVE A2,*A0+,L
MOVE A3,*A0+,L
MOVE A4,*A0+,L
MOVE A5,*A0+,L
MOVE A6,*A0+,L
MOVE A7,*A0+,L
MOVE A8,*A0+,L
MOVE A9,*A0+,L
MOVE A10,*A0+,L
MOVE A11,*A0+,L
MOVE A12,*A0+,L
MOVE A13,*A0+,L
MOVE A14,*A0+,L
MOVI DUMPMESS,A8
CALLR RAWPRINTP
; MOVI DMTIME,A8
; MOVI AUDONTIME,A0
; CALLA GET_AUD
; MOVK 1,A2
; CALLA FORMATLINE
MOVI AREGPRINT,A8
CALLR RAWPRINTP
; CALLR NEWLINE
MOVE B0,@AREGFILE,L ; B0
MOVI AREGFILE+20H,B0
MOVE B1,*B0+,L
MOVE B2,*B0+,L
MOVE B3,*B0+,L
MOVE B4,*B0+,L
MOVE B5,*B0+,L
MOVE B6,*B0+,L
MOVE B7,*B0+,L
MOVE B8,*B0+,L
MOVE B9,*B0+,L
MOVE B10,*B0+,L
MOVE B11,*B0+,L
MOVE B12,*B0+,L
MOVE B13,*B0+,L
MOVE B14,*B0+,L
MOVE @AREGFILE,B0,L ; RESTORE B0
MOVI BREGPRINT,A8
CALLR RAWPRINTP
; CALLR NEWLINE
MOVI STACKLOC,A8
CALLR RAWPRINTP
MOVI 11,A2
MOVE @LASTSTACK,A1 ; GRAB WHAT WE SAW AS A STACK
; ADDI 0A0H,A1
MOVI AREGFILE,A0
RAWDSLOOP
MOVE *A1+,*A0+,L
DSJS A2,RAWDSLOOP
MOVI STACKPRINT,A8
CALLR RAWPRINTP
; CALLR NEWLINE
MMFM SP,A0,A1,A2,A8
RETS
STACKLOC
.STRING "STACK POINTER = %08lX",0AH,00
.LONG LASTSTACK
**************************************************************************
* *
* TROGALIVE *
* *
* PRINT OUT A WELCOME TO TROG MESSAGE *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
TROGALIVE
.IF PRINTER
CREATE PRINT_PID,TROGPRINT
.ENDIF
RETS
TROGPRINT
MOVI TROGSTARTUP,A8
JSRP PRINTP
MOVI AUDUPTIME,A0
CALLA GET_AUD
MOVK 1,A2
MOVI PUPTIME,A8
CALLR FORMATLINE
MOVE @OFFTIME,A1,L
MOVI PALIVETIME,A8
MOVK 1,A2
CALLR FORMATLINE ; KICK OUT LAST ALIVE TIME
CALLR PRINTCREDS
DIE
TROGSTARTUP
.STRING "\bTROG!\b"
.STRING "\nVersion: %s"
.BYTE 0AH, 0
.WORD 1
.WORD 0
.LONG ROM_NAME
.EVEN
PRINTCREDS
MOVI TOTCREDS,A8
CLR A2
CALLA CRED_P ; CREDITS ON MACHINE
MOVE A0,A1
CALLR FORMATLINE
CALLR NEWLINE
RETS
TOTCREDS
.STRING "TOTAL GAME CREDITS",0
.EVEN
PUPTIME
.STRING "TOTAL GAME UPTIME",0
.EVEN
PALIVETIME
.STRING "TIME LAST ON FOR",0
.EVEN
**************************************************************************
* *
* PLCOIN *
* PRCOIN *
* PSCOIN *
* *
* PRINT OUT TIME STAMPS FOR THE COINS (LEFT,RIGHT,SERVICE) *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* JSRP *
* *
**************************************************************************
PLCOIN:
MOVI MLCOIN,A8
JRUC PCOIN
PRCOIN:
MOVI MRCOIN,A8
JRUC PCOIN
PSCOIN:
MOVI MSCOIN,A8
PCOIN:
MOVI AUDONTIME,A0
CALLA GET_AUD
MOVK 1,A2
CALLA FORMATLINE
RETP
MLCOIN .STRING "LEFT COIN",0
.EVEN
MRCOIN .STRING "RIGHT COIN",0
.EVEN
MSCOIN .STRING "SERVICE CREDIT",0
.EVEN
**************************************************************************
* *
* PRINTAUDS *
* *
* PRINT OUT THE AUDIT TABLE *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PRINTAUDS:
.IF PRINTER
JSRP PRINTCOINAGE
MOVI PAUDHEADER,A8
JSRP PRINTP
MOVI PRINTAUDTABLE,A11
PALOOP
MOVE *A11+,A8,L ; GET TEXT STRING
JRZ PADONE
MOVE *A11+,A0,W ; WHICH AUDIT
MOVE *A11+,A2,W ; WHICH FORMAT
CALLA GET_AUD ; GET THE VALUE ( IN A1 )
CALLR FORMATLINE1
JRUC PALOOP
PADONE
SLEEP 5
CALLR PBUFCK
JRNZ PADONE ; EMPTY OUT THE BUFFER FIRST
.ENDIF
RETP
PAUDHEADER
.STRING "\n\n\bTrog Game Audits :\b\n",0
.WORD 1
.WORD 0
.EVEN
PCR
.BYTE 0AH,00H
.EVEN
**************************************************************************
* *
* PRINTCOINAGE *
* *
* PRINT OUT THE COINAGE STUFF *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PRINTCOINAGE:
MOVI PCOINHEADER,A8
JSRP PRINTP
MOVI PRINTCOINTABLE,A11
PCLOOP
MOVE *A11+,A8,L ; GET TEXT STRING
JRZ PCDONE
MOVE *A11+,A0,W ; WHICH AUDIT
MOVE *A11+,A2,W ; WHICH FORMAT
CALLA GET_AUD ; GET THE VALUE ( IN A1 )
CALLR FORMATLINE1
JRUC PCLOOP
PCDONE
SLEEP 5
CALLR PBUFCK
JRNZ PCDONE ; EMPTY OUT THE BUFFER FIRST
RETP
PCOINHEADER
.STRING "\n\n\bTrog Coin Bookkeeping :\b\n",0
.WORD 1
.WORD 0
.EVEN
**************************************************************************
* *
* FORMATLINE *
* *
* FORMAT A LINE FOR PRINTING ( LEFT ON RIGHT, VALUE ON RIGHT ) *
* *
* ENTRY *
* A1 VALUE *
* A2 FORMAT *
* A8 LEFT STRING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
FORMATLINE1:
MMTM SP,A0,A5
JSRP PRINTP
JRUC FORMATLINEGO
FORMATLINE:
MMTM SP,A0,A5
JSRP NSPRINTP
FORMATLINEGO
CALLR SLEN ; LENGTH OF WHAT WE PLOTTED
MOVE A0,A5
MOVE A2,A2 ; SIMPLE NUMBER
JRNZ FLCK2
FLNUM
PUSH A0
MOVE A1,A0
MOVI MYSTRING,A7
CALLA CAT_A0
MOVI MYSTRING,A8
PULL A0
JRUC FLEND
FLCK2
CMPI 1,A2 ; CHECK FOR TIME
JRNZ FLCK3
MOVE A1,A3
CALLR FORMATTIME
JRUC FLEND
FLCK3
CMPI 2,A2 ; CHECK FOR TOTAL PLAYS
JRNZ FLCK4
CALLA GET_PLAYS
MOVE A2,A1
JRUC FLNUM
FLCK4
CMPI 3,A2 ; CHECK FOR TIME/CREDIT
JRNZ FLCK5
MMTM SP,A0,A1,A2
CLR A3
MOVI AUDNUMTC,A0
CALLA GET_AUD ; GET THE DIVISOR
MOVE A1,A2
JRZ DTCGO ; NO /0'S HERE, BUD
MOVI AUDAVGTC,A0
CALLA GET_AUD ; GET TOTAL TIME
CLR A0
DIVU A2,A0 ; A0 CONTAINS THE REAL NUMBER
MOVE A0,A3 ; NUMBER TO DISPLAY
DTCGO
MMFM SP,A0,A1,A2
CALLR FORMATTIME
JRUC FLEND
FLCK5
CMPI 4,A2
JRNZ FLCK6
MMTM SP,A0,A1,A2
CLR A3
MOVI AUDNUMTL,A0
CALLA GET_AUD ; GET THE DIVISOR
MOVE A1,A2
JRZ DTLGO ; NO /0'S HERE, BUD
MOVI AUDAVGTL,A0
CALLA GET_AUD ; GET TOTAL TIME
CLR A0
DIVU A2,A0 ; A0 CONTAINS THE REAL NUMBER
MOVE A0,A3 ; NUMBER TO DISPLAY
DTLGO
MMFM SP,A0,A1,A2
CALLR FORMATTIME
JRUC FLEND
FLCK6
CMPI 5,A2
JRNZ FLCK7
MMTM SP,A0,A1,A2
CLR A3
MOVI AUDNUMTG,A0
CALLA GET_AUD ; GET THE DIVISOR
MOVE A1,A2
JRZ DAWGO ; NO /0'S HERE, BUD
MOVI AUDWAVECNT,A0
CALLA GET_AUD ; GET TOTAL TIME
CLR A0
DIVU A2,A0 ; A0 CONTAINS THE REAL NUMBER
MOVE A0,A3 ; NUMBER TO DISPLAY
DAWGO
MMFM SP,A0,A1,A2
MOVE A3,A1
JRUC FLNUM
FLCK7
CMPI 6,A2
JRNZ FLCK8
MMTM SP,A0,A1,A2
CLR A3
MOVI AUDNUMTG,A0
CALLA GET_AUD ; GET THE DIVISOR
MOVE A1,A2
JRZ DACGO ; NO /0'S HERE, BUD
MOVI AUDAVGGC,A0
CALLA GET_AUD ; GET TOTAL CREDITS SPENT
CLR A0
DIVU A2,A0 ; A0 CONTAINS THE REAL NUMBER
MOVE A0,A3 ; NUMBER TO DISPLAY
DACGO
MMFM SP,A0,A1,A2
MOVE A3,A1
JRUC FLNUM
FLCK8
CMPI 7,A2
JRNZ FLCK9
MMTM SP,A0,A1,A2
CLR A3
MOVI AUDCONTOFFER,A0
CALLA GET_AUD ;CONTINUES OFFERED IS THE DIVISOR
MOVE A1,A2
JRZ DAPCTGO ;BR = 0 NOT ALLOWED IN THIS DIVIDE
MOVI AUDCONTTAKEN,A0
CALLA GET_AUD ;CONTINUES TAKEN IS THE DIVIDEND
MOVI 100,A0 ;MAKE IT A PERCENTAGE
MPYU A0,A1
DIVU A2,A1 ;AND GET IT
MOVE A1,A3 ;NUMBER TO DISPLAY
DAPCTGO
MMFM SP,A0,A1,A2
MOVE A3,A1
JRUC FLNUM
FLCK9
JRUC FLNOPLOT ; ANYTHING ELSE
FLEND
CALLR SLEN ; FIGURE OUT LENGTH OF STRING
ADD A5,A0 ; TOTAL LENGTH
MOVI 40,A1 ; 40 CHARS/LINE
SUB A0,A1
CALLR PSPACES ; PLOT THIS MANY SPACES
JSRP PSTRINGER ; PLOT OUT THE NUMBER
FLNOPLOT
MOVI PCR,A8
JSRP NSPRINTP
MMFM SP,A0,A5
RETS
NEWLINE
PUSH A8
MOVI PCR,A8
JSRP NSPRINTP
PULL A8
RETS
**************************************************************************
* *
* FORMATTIME *
* *
* ENTRY *
* A3 TIME TO PLOT *
* *
* EXIT *
* A8 STRING POINTER *
* *
**************************************************************************
FORMATTIME:
MMTM SP,A0,A1,A2,A7,A9,A10,A11
CLR A9 ; NO SECONDS
CLR A10 ; NO MINUTES
CLR A11 ; NO HOURS
MOVI MYSTRING,A7 ; STRING TO BUILD IN
MOVE A3,A1 ; BASE VALUE
JRZ PNOTIME
CLR A0 ; DIVIDEND IN <A0><A1>
MOVI 60,A2 ; 60 SECS/MINUTE
DIVU A2,A0 ; A0 = MINUTES, A1 = SECONDS
MOVE A1,A9 ; SET SECONDS
MOVE A0,A1 ; MINUTES/HOURS
JRZ PNOTIME
CLR A0
DIVU A2,A0 ; A0 = HOURS, A1 = MINUTES
MOVE A1,A10
MOVE A0,A11
PNOTIME
MOVE A11,A0
JRZ PNOHOURS
CALLA CAT_A0 ; HOURS
MOVI ME_COLON,A8
CALLA STRCAT
PNOHOURS
MOVE A10,A0
CMPI 10,A0
JRHS P1
CLR A0
CALLA CAT_A0 ; INSERT EXTRA ZERO
MOVE A10,A0
P1
CALLA CAT_A0 ; MINUTES
MOVI ME_COLON,A8
CALLA STRCAT
MOVE A9,A0
CMPI 10,A0
JRHS P2
CLR A0
CALLA CAT_A0 ; INSERT EXTRA ZERO
MOVE A9,A0
P2
CALLA CAT_A0 ; SECONDS
MMFM SP,A0,A1,A2,A7,A9,A10,A11
MOVI MYSTRING,A8
RETS
ME_COLON:
.STRING ":",0
.EVEN
**************************************************************************
* *
* PSPACES *
* *
* PRINT OUT SOME SPACES *
* *
* ENTRY *
* A1 NUMBER OF SPACES *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PSPACES:
CMPI 0,A1
JRLS PDONE
MOVI 20H,A0
CALLR PADDCHAR
DEC A1
JRUC PSPACES
PDONE
RETS
SLEN
MMTM SP,A1,A8
CLR A0
SLOOP
MOVB *A8,A1
JRZ SDONE
ADDK 8,A8
INC A0
JRUC SLOOP
SDONE
MMFM SP,A1,A8
RETS
**************************************************************************
* *
* PRINTP *
* *
* STRINGF A STRING AND PRINT IT OUT *
* *
* ENTRY *
* A8 STRING TO PRINT *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PRINTP:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10,A11
CALLA READ_DIP ; CHECK IF PRINTER ENABLED
ANDI 80H,A0
JRNZ PRINTPRET
CALLA STRINGF
PUSHP A8
JSRP PSTRINGER
PULLP A8
PRINTPRET
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10,A11
RETP
NSPRINTP:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
CALLA READ_DIP ; CHECK IF PRINTER ENABLED
ANDI 80H,A0
JRNZ NSPRINTPRET
JSRP PSTRINGER
NSPRINTPRET
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
RETP
RAWPRINTP:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
CALLA READ_DIP ; CHECK IF PRINTER ENABLED
ANDI 80H,A0
JRNZ RAWPRINTPRET
CALLA STRINGF
CALLR RAWPRINT
RAWPRINTPRET
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
RETS
**************************************************************************
* *
* PSTRINGER *
* *
* OUTPUT A TEXT STRING TO THE LITTLE BABY PRINTER *
* *
* ENTRY *
* A8 WHAT TO PRINT *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PSTRINGER:
MMTM SP,A0,A1,A7,A8,A11
CALLR PRINT_P
JRNZ STRINGR2
CLR A0
MOVE A0,@PRINTERIN,W ; NOTHING GOING IN OR OUT
MOVE A0,@PRINTEROUT,W
CREATE PRINT_PID,PRINT_PROCESS ; GET A BACKGROUND PRINTER
STRINGR2
MOVB *A8,A7 ;GET A CHARACTER
SLL 24,A7
SRL 24,A7 ;MAKE SURE WE'RE POSITIVE
JREQ STRINGRX ;BR = STRING BE GONE BROTHA
ADDK 8,A8 ;NEXT BYTE
CMPI ' ',A7
JRHS STRNCHAR ;BR = IT'S KOSH BABY
;
; CHECK FOR CONTROL CHARACTERS
;
STRNCONT
CMPI NEW_SLEEP,A7 ; SLEEP?
JRNE STRCC1
MOVE *A8+,A0,W ; EAT IT
JRUC STRINGR2
STRCC1
CMPI NEW_PCOLOR,A7 ; COLOR
JRNE STRCC2
MOVE *A8+,A1,W ; GRAB THE NEW COLOR
JRZ SCC1BLK
MOVI 1BH,A0
CALLR PADDCHAR ; ESC
MOVI 34H,A0
CALLR PADDCHAR
JRUC STRINGR2
SCC1BLK
MOVI 1BH,A0
CALLR PADDCHAR
MOVI 35H,A0
CALLR PADDCHAR
JRUC STRINGR2
STRCC2
CMPI NEW_CONTROL,A7 ; DMA CONTROL FLAGS
JRNE STRCC3
MOVE *A8+,A0,W ; EAT IT
JRUC STRINGR2
STRCC3
CMPI NEW_FONT,A7 ; FONT
JRNE STRCC4
MOVE *A8+,A0,L ; SNAG IT
JRZ SCC3RES
MOVI 1BH,A0
CALLR PADDCHAR
MOVI 0EH,A0
CALLR PADDCHAR
JRUC STRINGR2
SCC3RES
MOVI 1BH,A0
CALLR PADDCHAR
MOVI 14H,A0
CALLR PADDCHAR
JRUC STRINGR2
STRCC4
CMPI NEW_XY,A7 ; NEW XY LOCATION
JRNE STRCC5
MOVE *A8+,A0,L ; EAT IT
JRUC STRINGR2
STRCC5
CMPI NEW_SPACING,A7 ; NEW SPACING
JRNE STRCC6
MOVE *A8+,A0,L ; EAT IT
JRUC STRINGR2
STRCC6
CMPI ASCII_CR,A7 ; CR
JRNZ STRCC7
MOVI 0AH,A7 ; SET TO SOMETHING USEFUL
JRUC STRNCHAR
STRCC7
CMPI ADD_DYDX,A7 ; DXDY CHANGE
JRNE STRCC8
MOVE *A8+,A0,L ; EAT IT
JRUC STRINGR2
STRCC8
; JRUC STRINGR2 ; TAKE A PILL, PASS CONTROL CODES TO PRINTER
;
; OUTPUT A CHARACTER HERE
;
STRNCHAR
MOVE A7,A0
CALLR PADDCHAR
; MOVE @PRINTERIN,A0,W
; MOVE A0,A1
; SLL 3,A0
; ADDI PRINTERBUF,A0
; MOVB A7,*A0
; INC A1
; ANDI PBUFSIZE-1,A1 ; WRAP IT
; MOVE A1,@PRINTERIN,W
JRUC STRINGR2
STRINGRX
MMFM SP,A0,A1,A7,A8,A11
RETP
**************************************************************************
* *
* PADDCHAR *
* *
* ADD A CHARACTER IN A0 TO THE PRINTER BUFFER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PADDCHAR:
MMTM SP,A1,A2
MOVE @PRINTERIN,A1,W
MOVE A1,A2
SLL 3,A1
ADDI PRINTERBUF,A1
MOVB A0,*A1
INC A2
ANDI PBUFSIZE-1,A2 ; WRAP IT
MOVE A2,@PRINTERIN,W
MOVE @PRINTEROUT,A1,W
CMP A1,A2
JRNZ PACOOL
NOP
PACOOL
MMFM SP,A1,A2
RETS
**************************************************************************
* *
* PRINT_PROCESS *
* *
* JUST A PROCESS TO MANAGE THE PRINTER QUEUE AND TRY AND KEEP *
* THE GAME FROM LOCKING UP TOO MUCH WHEN IT RUNS OUT OF PAPER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PRINT_TIMEOUT EQU 0FFH ; LOOP TIME FOR BUSY
PRINT_BURST EQU 50 ; MAX CHARS WITHOUT SLEEP
PRINT_PROCESS:
CALLA READ_DIP ; CHECK IF PRINTER ENABLED
ANDI 80H,A0
JRZ PRINTGO1
DIE
PP1
CLR A0
MOVE A0,@PRINTDEAD,W ; FLAG PRINTER AS UP
PRINTLOOP
SLEEP 3 ; EVERYBODY ELSE GETS A CHANCE
CALLA READ_DIP ; CHECK IF PRINTER ENABLED
ANDI 80H,A0
JRZ PRINTGO1
CLR A0
MOVE A0,@PRINTERIN,W
MOVE A0,@PRINTEROUT,W
DIE
PRINTGO1
MOVE @SWITCH,A0,W
ANDI 0C000H,A0
CMPI 4000H,A0
JRZ PPGOPRINT
CLR A0
MOVE A0,@PRINTERIN,W
MOVE A0,@PRINTEROUT,W
MOVK 1,A0
MOVE A0,@PRINTDEAD,W
SLEEP 100
JRUC PRINTLOOP
PPGOPRINT
CLR A4
MOVE @PRINTDEAD,A0,W
JRZ PPBURST ; BR = PRINTER HEALTHY
MOVE @SWITCH,A0,W
ANDI 80H,A0 ; CHECK IF STILL BUSY
JRNZ PRINTLOOP ; BR = BORING
PPBURST
MOVE @PRINTERIN,A0,W
MOVE @PRINTEROUT,A1,W
CMP A0,A1
JRZ PRINTLOOP ; BR = NOTHING TO OUTPUT
MOVE A1,A3
SLL 3,A1
ADDI PRINTERBUF,A1
MOVB *A1,A0 ; GET THE BYTE TO PRINT
ORI 0FF00H,A0 ; UNSET THE STROBE
MOVE A0,@SOUND,W
ANDI PRINTSTROBE,A0 ; SET THE STROBE
MOVE A0,@SOUND,W
ORI 0FF00H,A0
MOVE A0,@SOUND,W
MOVI PRINT_TIMEOUT,A2
PPLOOP
MOVE @SWITCH,A1,W
ANDI 80H,A1
JRZ PPOK
DSJS A2,PPLOOP ; LOOP WAITING FOR BUSY TO GO AWAY
;
; OK, SOMETHING WENT WRONG WITH THE PRINTER -- NEVER CAME BACK ALIVE
;
MOVK 1,A0
MOVE A0,@PRINTDEAD,W ; FLAG IT HISTORY
INC A3 ; OUTPUT POINTER
ANDI PBUFSIZE-1,A3 ; WRAP IT
MOVE A3,@PRINTEROUT,W
SLEEP 5 ; GIVE IT SOME SERIOUS TIME
JRUC PRINTLOOP ; TRY AGAIN
;
; ITS A HAPPENING PRINTER
;
PPOK
CLR A0
MOVE A0,@PRINTDEAD,W ; FLAG PRINTER AS UP
INC A3 ; OUTPUT POINTER
ANDI PBUFSIZE-1,A3 ; WRAP IT
MOVE A3,@PRINTEROUT,W
INC A4 ; CHARACTERS OUT THIS TIME
CMPI PRINT_BURST,A4
JRLO PPBURST ; BR = STILL IN BURST MODE
JRUC PRINTLOOP
**************************************************************************
* *
* RAWPRINT *
* *
* PRINT OUT A STRING OF CHARACTERS -- THIS WAITS FOR IT TO *
* FINISH OR DIE, BTW *
* *
* ENTRY *
* A8 LIST OF CHARS TO PRINT OUT *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
RAWTIMEOUT EQU 0FFFFFFFH ; RAW PRINTER TIMEOUT - GROSS, HUH?
RAWPRINT:
MMTM SP,A0,A1,A2,A3
RAWLOOP
CALLA READ_DIP ; CHECK IF PRINTER ENABLED
ANDI 80H,A0
JRNZ RAWDONE
MOVE @SWITCH,A0,W
ANDI 0C000H,A0
CMPI 4000H,A0
JRNZ RAWDONE ; ERROR/OUTOFPAPER
MOVB *A8,A0 ; GET THE BYTE TO PRINT
MOVE A0,A0
JRZ RAWDONE
ADDK 8,A8
ORI 0FF00H,A0 ; UNSET THE STROBE
MOVE A0,@SOUND,W
ANDI PRINTSTROBE,A0 ; SET THE STROBE
MOVE A0,@SOUND,W
ORI 0FF00H,A0
MOVE A0,@SOUND,W
MOVI RAWTIMEOUT,A2
CLR A3
RPWAIT
MOVE @SWITCH,A1,W
ANDI 80H,A1
JRZ RAWLOOP
INC A3
DSJS A2,RPWAIT ; LOOP WAITING FOR BUSY TO GO AWAY
RAWDONE
MMFM SP,A0,A1,A2,A3
RETS
PEMPTYWAIT:
SLEEP 5
CALLR PBUFCK
JRNZ PEMPTYWAIT ; EMPTY OUT THE BUFFER FIRST
RETP
**************************************************************************
* *
* PBUFCK *
* *
* CHECKS TO SEE WHETHER THERE IS ANYTHING IN THE PRINTER BUFFER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* .Z. EMPTY *
* *
**************************************************************************
PBUFCK:
MMTM SP,A0,A1
CALLA READ_DIP
ANDI 80H,A0
JRZ PBU1
CLR A0
MOVE A0,A0
JRUC PBURET
PBU1
MOVE @PRINTERIN,A0,W
MOVE @PRINTEROUT,A1,W
CMP A0,A1
PBURET
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* PRINT_P *
* *
* CHECK FOR THE EXISTENCE OF THE PRINTER BACKGROUND HANDLER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* .EQ. NO *
* .NE. YES *
* *
**************************************************************************
PRINT_P MOVI PRINT_PID,A0 ; PRINTER PID ( DUH )
MOVI 0FFFFH,A1
CALLA EXISTP
RETS
.ENDIF