|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 2432 (0x980) Types: TextFile Names: »INDIR.SRC«
└─⟦c9df7130d⟧ Bits:30005915 Pascal MT+ Release 5.2 (Jet-80) └─ ⟦this⟧ »INDIR.SRC«
;INDIRECT LOAD AND STORE, AND ADDR. CALCULATION ROUTINES ; NAME INDIR ENTRY ILOD1,ILOD11,ILOD12,ILOD2,ILOD21,ILOD22,ILODV,ILODV1 ENTRY ILODV2,ISTOR,ISTOR1,ISTOR2,XADDR,YADDR ; ILOD1: MOV C,A ;LOAD A ZERO ILOD11: MOV B,A ;CLEAR THE HIGH BYTE ILOD12: PUSH B ;SAVE THE OFFSET PUSH X ;INDIRECT ALWAYS OF X REG POP B ;ADD OFFSET REG TO VADDR FIELD DAD B ;WHICH IS IN HL MOV B,M ;GET VARIABLE BASE ADDRESS DCX H MOV C,M IL1V: POP H ;GET OFFSET DAD B ;ADD TO BASE ADDRESS MOV L,M ;GET VALUE MOV H,A ;CLEAR HIGH BYTE RET ;DONE!!! ; ; ILOD2: MOV C,A ;LOAD A ZERO ILOD21: MOV B,A ;CLEAR THE HIGH BYTE ILOD22: PUSH B ;SAVE THE OFFSET PUSH X ;INDIRECT ALWAYS OF X REG POP B ;ADD OFFSET REG TO VADDR FIELD DAD B ;WHICH IS IN HL MOV B,M ;GET VARIABLE BASE ADDRESS DCX H MOV C,M IL2V: POP H ;GET OFFSET DAD B ;ADD TO BASE ADDRESS MOV B,M ;GET HIGH BYTE DCX H MOV L,M ;GET LOW BYTE MOV H,B ;RESTORE HIGH BYTE RET ;DONE!!! ; ; ILODV: MOV C,A ;LOAD A ZERO ILODV1: MOV B,A ;CLEAR THE HIGH BYTE ILODV2: PUSH B ;SAVE THE OFFSET PUSH X ;ALWAYS USE X-REG FOR INDIRECT POP B ;ADD OFFSET REG TO VADDR FIELD DAD B ;WHICH IS IN HL MOV B,M ;GET HIGH ORDER ADDRESS BYTE DCX H MOV C,M ;GET LOW ORDER ADDRESS BYTE DCX H MOV A,M ;GET VARIABLE SIZE DCR A ;CHECK SIZE JRZ IL1V ;LOAD VAR OF SIZE 1 XRA A ;LOAD VAR OF SIZE 2 JR IL2V ;DONE!!! ; ; ISTOR: MOV C,A ;LOAD A ZERO ISTOR1: MOV B,A ;CLEAR THE HIGH BYTE ISTOR2: PUSH B ;SAVE THE OFFSET PUSH X ;ALWAYS USE X-REG FOR INDIRECT POP B ;ADD OFFSET REG TO VADDR FIELD DAD B ;WHICH IS IN HL MOV B,M ;HIGH PART DCX H MOV C,M ;LOW PART DCX H MOV A,M ;GET VARIABLE SIZE POP H ;RESTORE OFFSET DAD B ;ADD OFFSET TO THE VARIABLE ADDRESS DCR A JRZ ISTR1 ;STORE A ONE BYTE VARIABLE XRA A ;CLEAR ACCUMULATOR MOV M,D ;STORE HIGH BYTE MOV D,A ;CLEAR HIGH BYTE DCX H ISTR1: MOV M,E ;STORE LOW BYTE CMP D ;CHECK HIGH BYTE FOR OVERFLOW RET ; ; XADDR: XRA A DSBC D ;SUBTRACT VARPART PUSH X ;GET X-REG POP D ;X-REG -> B-REG DAD D ;ADD OFFSET TO REGISTER RET ;DONE!!! ; ; YADDR: XRA A DSBC D ;SUBTRACT VARPART PUSH Y ;GET Y-REG POP D ;Y-REG -> B-REG DAD D ;ADD OFFSET TO REGISTER RET ;DONE!!! ;«eof»